#ifndef DATA_MANAGER_H
#define DATA_MANAGER_H

#include "ns3/core-module.h"
#include "ns3/vector.h"
#include <string>
#include <vector>
#include <map>

namespace ns3 {

/**
 * @brief 车辆位置和速度数据结构
 */
struct VehicleData {
  uint32_t id;           ///< 车辆ID
  double time;           ///< 时间(秒)
  Vector position;       ///< 位置(x,y,z)
  double speed;          ///< 速度(m/s)
};

/**
 * @brief 基站/卫星位置数据结构
 */
struct NodePositionData {
  uint32_t id;           ///< 节点ID
  Vector position;       ///< 位置(x,y,z)
};

/**
 * @brief 数据管理器类，负责加载和保存数据
 */
class DataManager 
{
public:
  /**
   * @brief 构造函数
   */
  DataManager();
  
  /**
   * @brief 析构函数
   */
  ~DataManager();
  
  /**
   * @brief 初始化数据管理器
   * @return 初始化是否成功
   */
  bool Initialize();
  
  /**
   * @brief 获取所有车辆ID
   * @return 车辆ID列表
   */
  std::vector<uint32_t> GetAllVehicleIds() const;
  
  /**
   * @brief 获取指定车辆的轨迹数据
   * @param vehicleId 车辆ID
   * @return 车辆轨迹数据
   */
  std::vector<VehicleData> GetVehicleTrajectory(uint32_t vehicleId) const;
  
  /**
   * @brief 获取地面基站位置数据
   * @return 地面基站位置数据列表
   */
  std::vector<NodePositionData> GetGroundStationPositions() const;
  
  /**
   * @brief 获取卫星位置数据
   * @return 卫星位置数据列表
   */
  std::vector<NodePositionData> GetSatellitePositions() const;
  
  /**
   * @brief 保存性能数据到CSV文件
   * @param vehicleId 车辆ID
   * @param nodeId 节点ID (基站或卫星)
   * @param nodeType 节点类型 ("GroundStation"或"Satellite")
   * @param data 性能数据
   * @param outputDir 输出目录
   * @return 保存是否成功
   */
  bool SavePerformanceData(uint32_t vehicleId, 
                           uint32_t nodeId, 
                           const std::string& nodeType,
                           const std::map<std::string, double>& data, 
                           const std::string& outputDir) const;

private:
  /**
   * @brief 加载车辆轨迹数据
   * @return 加载是否成功
   */
  bool LoadVehicleData();
  
  /**
   * @brief 加载地面基站位置数据
   * @return 加载是否成功
   */
  bool LoadGroundStationData();
  
  /**
   * @brief 加载卫星位置数据
   * @return 加载是否成功
   */
  bool LoadSatelliteData();
  
  /**
   * @brief 解析车辆文件名，提取ID
   * @param filename 文件名
   * @return 车辆ID，如果解析失败则返回0
   */
  uint32_t ParseVehicleId(const std::string& filename) const;

private:
  std::string m_dataPath;                                     ///< 数据文件路径
  std::vector<NodePositionData> m_groundStationPositions;     ///< 地面基站位置数据
  std::vector<NodePositionData> m_satellitePositions;         ///< 卫星位置数据
  std::map<uint32_t, std::vector<VehicleData>> m_vehicleData; ///< 车辆轨迹数据
};

} // namespace ns3

#endif // DATA_MANAGER_H
